/*任务线程池*/
//线程池分为任务循环链表和线程双向链表
//本线程池适用于循环执行的任务,线程执行任务后不会删除任务
//如果需要删除任务，需要手动删除
//删除任务会阻塞到任务处于等待状态
//删除线程会阻塞到线程空闲
#ifndef RTSP_SERVICE_TTHREADPOOL_H
#define RTSP_SERVICE_TTHREADPOOL_H

#include <pthread.h>

//任务执行返回
#define TTHREADTASK_RET_RUN             0       //继续运行任务
#define TTHREADTASK_RET_CANCEL          1       //取消任务

//任务状态
#define TTHREADTASK_STATE_WAIT          0   //任务等待,等待线程执行任务
#define TTHREADTASK_STATE_RUN           1   //任务运行,线程正在运行任务
#define TTHREADTASK_STATE_PAUSE         2   //任务暂停,使线程不执行此任务
#define TTHREADTASK_STATE_WAIT_CANCEL   3   //任务等待取消,外部取消任务标记
#define TTHREADTASK_STATE_CANCEL        4   //任务取消,任务可以取消

//线程状态
#define TTHREADTHREAD_STATE_RUN             0   //线程运行
#define TTHREADTHREAD_STATE_WAIT_DESTROY    3   //线程等待销毁
#define TTHREADTHREAD_STATE_DESTROY         4   //线程销毁


//任务线程任务,线程执行的基本单元
typedef struct TThreadTask {
    unsigned char task_state;       //任务执行状态
    int (*fun)(void *data);         //任务执行函数,短暂的循环函数
    void *data;                     //任务数据区指针
    struct TThreadTask *last_task;  //上一个任务
    struct TThreadTask *next_task;  //下一个任务
} TThreadTask;

//任务线,线程
typedef struct TThreadThread {
    unsigned char thread_state;     //线程状态
    struct TThreadPool *pool;       //所属线程池
    pthread_t thread_id;            //线程号
    struct TThreadThread *last;     //上一个线程
    struct TThreadThread *next;     //下一个线程
} TThreadThread;


//线程池,存储线程链表、任务链表、锁
//用于任务分片及线程管理
typedef struct TThreadPool {
    unsigned int thread_number;              //当前线程数量
    unsigned int leisure_thread_number;      //空闲线程数量
    unsigned int task_number;                //当前的任务数量
    unsigned int wait_task_number;           //等待的任务数量

    pthread_mutex_t task_operate_lock;       // 任务操作互斥锁
    pthread_mutex_t thread_operate_lock;     // 线程操作互斥锁

    struct TThreadThread *thread_list;       //线程链表
    struct TThreadTask *task_list;           //任务链表
} TThreadPool;

//线程池创建
extern void TThreadPool_create(TThreadPool *pool);

//线程池销毁
extern void TThreadPool_destroy(TThreadPool *pool);

//线程池增加线程
extern int TThreadPool_thread_add(TThreadPool *pool, TThreadThread *tthread);

//线程池减少线程
extern void TThreadPool_thread_sub(TThreadPool *pool, TThreadThread *tthread);

//线程池添加任务
extern void TThreadPool_task_add(TThreadPool *pool, TThreadTask *new_task);

//线程池删除任务
extern void TThreadPool_task_delete(TThreadPool *pool, TThreadTask *task);

//线程池暂停任务
extern void TThreadPool_task_pause(TThreadPool *pool, TThreadTask *task);

//线程池开始任务
extern void TThreadPool_task_start(TThreadPool *pool, TThreadTask *task);

//初始化一个任务
extern void TThreadPool_task_set(TThreadTask *new_task, void *fun, void *data);

#endif //RTSP_SERVICE_TTHREADPOOL_H
